package cn.openea.perpartner.mpwx.service.impl;

import cn.hutool.core.util.StrUtil;
import cn.openea.perpartner.mpwx.entity.MagmasConfig;
import cn.openea.perpartner.mpwx.service.*;
import cn.openea.perpartner.mpwx.util.WeChatUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;

import java.util.HashMap;
import java.util.List;
import java.util.stream.Collectors;

/**
 * @author Weird077
 * @description R_SL02_B002:微信公众号入口
 * @date 2022-06-20 11:19
 */
@Service
public class WxMpReplyServiceImpl implements IWxMpReplyService {
    @Value("${weixin.sToken}")
    private  String sToken;
    /**
     *  R_SL02_B006
     */
    @Autowired
    private IWxMpMsgService wxMpMsgService;
    /**
     * R_SL02_B005
     */
    @Autowired
    private IWxMpMediaService wxMpMediaService;
    /**
     * MsgMamgUtail
     */
    @Autowired
    private IMagmasMsgService magmasMsgService;
    @Autowired
    private IMagmasConfigService magmasConfigService;

    @Override
    public String run(HashMap<String,Object> params) throws Exception {
        //1、接受微信发过来的消息
        String signature = (String) params.get("signature");
        String echostr = (String) params.get("echostr");
        String timestamp = (String) params.get("timestamp");
        String nonce = (String) params.get("nonce");
        //2、微信公众号首次填写服务器url时使用
        if (StrUtil.isNotBlank(echostr)){
            return echostr;
        }
        //3、验证消息的合法性
        // 1）将token、timestamp、nonce三个参数进行字典序排序
        // 2）将三个参数字符串拼接成一个字符串进行sha1加密
        // 3）开发者获得加密后的字符串可与signature对比，标识该请求来源于微信
        // 参考于：https://blog.csdn.net/hua1017177499/article/details/79047697
        if (!WeChatUtil.checkSignature(signature, timestamp, nonce,sToken)) {
            // 消息验证失败说明不是微信发过来的请求
            return "";
        }
        //4、开始获取微信post过来的数据
        String xmlStr = WeChatUtil.getWeiXinXml();
        // 公众号的OpenId，也即注册公众号时的初始id（原始ID，在公众号设置->帐号详情->注册信息内可以查到）
        String toUserName = WeChatUtil.getXmlValue(xmlStr, "ToUserName");
        // 发送者的OpenId，即操作者的身份
        String fromUserName = WeChatUtil.getXmlValue(xmlStr, "FromUserName");
        // 消息内容
        String content = WeChatUtil.getXmlValue(xmlStr, "Content");
        // 事件类型
        String event = WeChatUtil.getXmlValue(xmlStr, "Event");
        // 事件值，一般是参数的形式
        String eventKey = WeChatUtil.getXmlValue(xmlStr, "EventKey");
        // 设置好规则调用时的参数
        params.put("fromUserName", fromUserName);
        params.put("toUserName", toUserName);
        params.put("eventKey", eventKey);
        params.put("event", event);

        //5.获取所有消息配置记录，并存入hashmap
        List<MagmasConfig> list = magmasConfigService.selectList();
        HashMap<String,String> msgMap = new HashMap<>();
        list.forEach(obj-> msgMap.put(obj.getEventkey(),obj.getContent()));

        //后台通用消息回复，除特殊处理的逻辑外。如查询积分和邀请有礼，
        //getEventkey 配置关键字。不可多个用“,”隔开，getEventkey和getContent可多对一关系，即Eventkey不同，回复消息Content相同
        //getContent  配置消息内容
        if(msgMap.containsKey(content)){
            return StrUtil.isNotBlank(msgMap.get(content))?WeChatUtil.sendTextMsg(fromUserName, toUserName,msgMap.get(content)):"";
        }
        //6、关注与取消关注本公众号时处理的逻辑
        //关注：发送欢迎消息，并做接口记录入库
        //取关：当前不做任何操作，后续补充
        if(msgMap.containsKey(event) && ("subscribe".equals(event) || "unsubscribe".equals(event))){
            wxMpMsgService.run(params);
            return StrUtil.isNotBlank(msgMap.get(content))?WeChatUtil.sendTextMsg(fromUserName, toUserName,msgMap.get(content)):"";
        }
        //根据content，筛选符合条件的配置记录
        list = list.stream()
                .filter(obj->obj.getEventkey().toUpperCase().contains(content.toUpperCase()))
                .collect(Collectors.toList());
        //7、消息回复获取邀请码功能
        if (!list.isEmpty() && list.get(0).getEventkey().toUpperCase().contains("YQ")) {
            // 获取生成的邀请二维码，并通过素材管理中的接口上传多媒体文件，得到的id
            String media_id =wxMpMediaService.run(params);
            // 通过API发送提醒消息，因为xml消息不能被发送两次
            magmasMsgService.sendTextMsg(fromUserName, list.get(0).getContent());
            // 这里只能发一个以XML的消息，其它附加消息，需要通过api的接口来触发
            return   WeChatUtil.sendImageMsg(fromUserName, toUserName, media_id);
        }
        return "";
    }

}
